package com.j4dream.property.javabasic.thread;

// 多线程环境下，如果需要确保某一线程执行完毕后才可继续执行后续的代码，就可以通过使用 join 方法完成这一需求设计。
// 在项目实践中经常会遇到一个场景，就是需要等待某几件事情完成后主线程才能继续往下执行， 比如多个线程加载资源， 需要等待多个线程全部加载完毕再汇总处理。
// Thread 类中有一个 join 方法就可以做这个事情，join 方法是 Thread 类直接提供的。join 是无参且返回值为 void 的方法。
// await Promise.all(t1, t2, t3)
public class ThreadJoin {
    public static void main(String[] args) throws InterruptedException {
        Thread threadOne = new Thread(new Runnable() { //线程 1
            @Override
            public void run() {
                try {
                    Thread.sleep(5000); //线程 1 休眠 5 秒钟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程 1 休眠 5 秒钟，执行完毕。");
            }
        });

        Thread threadTwo = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000); //线程 2 修眠 10 秒钟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程 2 修眠 10 秒钟，执行完毕。");
            } //线程 2
        });

        Thread threadThree = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(8000); //线程 3 修眠 8 秒钟
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程 3 修眠 8 秒钟，执行完毕。");
            }//线程 3
        });

        Long startTime = System.currentTimeMillis();
        threadOne.start();
        threadTwo.start();
        threadThree.start();
        System.out.println("等待三个线程全部执行完毕再继续向下执行,我要使用 join 方法了。");
        threadOne.join(); //线程 1 调用 join 方法
        threadTwo.join(); //线程 2 调用 join 方法
        threadThree.join(); //线程 3 调用 join 方法
        Long endTime = System.currentTimeMillis();
        System.out.println("三个线程都执行完毕了，共用时： " + (endTime - startTime) + "毫秒");
    }
}


